package Cliente.interface_grafico;

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Toolkit;

import baralho.carta.Carta;

public class CartaUI{

	private Canvas canvas;
	private Image frente;
	private Image verso;
	private Image actual;
	private Carta carta;
	private int x;
	private int y;
	private int width;
	private int height;
	private int nivel;
	private boolean qualidade;

	public CartaUI(Carta carta, int width, int height, Canvas canvas) {
		this.canvas = canvas;
		this.carta = carta;
		this.width = width;
		this.height = height;
		this.setLocation(-30, -30);
		this.qualidade = true;

		//Ir buscar as imagens para a carta
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		this.verso = toolkit.getImage("cartas/back01.gif");
		if(carta != null){
			this.setFrente(carta);
		}
		this.actual = this.verso;
	}

	public void setLocation(int i, int j) {
		this.x = i;
		this.y = j;
	}

	public void paint(Graphics g){
		if(qualidade){
			((Graphics2D) g).setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
			
		}else{
			((Graphics2D) g).setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
			((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
			
		}
		g.drawImage(this.actual, this.x, this.y, this.getWidth(), this.getHeight(), null);
		((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	}

	public void setFrente(Carta carta){
		assert (carta != null);
		//Ir buscar a imagem para a carta
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		String frente = "";
		frente += (carta.getValor().ordinal() + 2) + "";
		if(frente.length() == 1) frente = "0" + frente;

		switch(carta.getNaipe().ordinal()){
		case 0:
			frente += "d";
			break;
		case 1:
			frente += "h";
			break;
		case 2:
			frente += "s";
			break;
		case 3:
			frente += "c";
			break;
		}
		this.frente = toolkit.getImage("cartas/" + frente + ".gif");
	}

	public void moveTo(Point p, MesaGrafica mesa){
		this.qualidade = false;	//A carta vai mexer-se. A rapidez na pintura e mais importante doque a qualidade.
		//Qual o caminho a percorrer?
		int desvio_x = p.x - this.getX();
		int desvio_y = p.y - this.getY();
		int passo_x = 0;
		int passo_y = 0;

		
		if(desvio_x != 0 && desvio_y != 0){
			if(Math.abs(desvio_x) > Math.abs(desvio_y)){
				passo_x = Math.round((float)desvio_x / (float)Math.abs(desvio_y));
				passo_y = desvio_y / Math.abs(desvio_y);
			}else if(Math.abs(desvio_y) > Math.abs(desvio_x)){
				passo_y = Math.round((float)desvio_y / (float)Math.abs(desvio_x));
				passo_x = desvio_x / Math.abs(desvio_x);
			}else{
				passo_y = desvio_y / Math.abs(desvio_y);
				passo_x = desvio_x / Math.abs(desvio_x);
			}
		}else if(desvio_x == 0 && desvio_y != 0){
			passo_x = 0;
			passo_y = desvio_y / Math.abs(desvio_y);
		}else if(desvio_y == 0 && desvio_x != 0){
			passo_y = 0;
			passo_x = desvio_x / Math.abs(desvio_x);
		}

		while(!(this.getX() == p.getX() && this.getY() == p.getY()) && mesa.isAnimar_cartas()){
			//Se a distancia for maior doque o proximo passo a fazer
			if(Math.abs(this.getX()-p.x) < Math.abs(passo_x) && passo_x != 0){
				passo_x = passo_x / Math.abs(passo_x);
			}
			if(this.getX() == p.x){
				passo_x = 0;
			}
			
			if(Math.abs(this.getY()-p.y) < Math.abs(passo_y) && passo_y != 0){
				passo_y = passo_y / Math.abs(passo_y);
			}
			if(this.getY() == p.y){
				passo_y = 0;
			}
			
			this.setLocation(this.getX() + passo_x, this.getY() + passo_y);
			this.canvas.repaint(this.x-Math.abs(passo_x), this.y-Math.abs(passo_y), this.width+2*Math.abs(passo_x), this.height+2*Math.abs(passo_y));	//repintar o espaco sujeito a alteracoes
			try {
				Thread.currentThread().sleep(0L, 100);
			} catch (InterruptedException e) {}
		}
		this.setLocation(p.x, p.y);
		this.canvas.repaint();

		this.qualidade = true;	// A animacao acabou. A qualidade deve ser aumentada agora.
	}

	public void mostra(){
		if(this.frente != null) this.actual = this.frente;
	}

	public void esconde(){
		this.actual = this.verso;
	}

	public Carta getCarta() {
		return carta;
	}
	
	public int getNivel(){
		return this.nivel;
	}
	
	public void setNivel(int nivel){
		this.nivel = nivel;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}
	
	public void setSize(int width, int height){
		this.width = width;
		this.height = height;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public boolean noPonto(Point point) {
		return point.x >= this.x && point.x <= this.x+this.width && point.y >= this.y && point.y <= this.y+this.height;
	}
}
